/***********************/
/** 仅支持主进程引入使用 **/
/**********************/

// 原本应该归属 main 文件夹的，但因为 renderer/serve 和 server/* 需要引入类型，所以放在公共目录

import fs from 'fs';
import path from 'path';
import jsonfile from 'jsonfile';
import store from '../../main/store';

export interface IServer {
    isRun: boolean; // 服务开启状态

    port: number; // 端口
    serverName: string; // 服务名
    assetsDirPath: string; // 资源访问目录
    defaultAssets: string; // 默认的请求资源
    rewrite: string; // 客户端请求资源 404 时，返回该资源

    openGZip: boolean; // 开启压缩
    openHttps: boolean; // 开启 HTTPS

    privateKey: string; // SSL key
    certificate: string; // SSL pem
}

export interface IConfig {
    configPath: string; // 配置文件路径
    servers: Array<IServer>; // 各服务配置
}

class ServeConfig {
    config: IConfig;

    constructor() {
        this.createServeConfigFile();
        this.config = this.readServeConfig();

        // 初始化服务运行状态
        this.config.servers.forEach(server => {
            server.isRun = false;
        });
        this.writeServeConfig();
    }

    /**
     * serve config 文件路径
     */
    static serveConfigPath(): { dir: string; path: string } {
        return {
            dir: store.state.runtime.paths.appDataServeConfig,
            path: path.join(store.state.runtime.paths.appDataServeConfig, 'index.json'),
        };
    }

    /**
     * 添加 Server 配置项
     */
    addServer(server: IServer): void {
        this.config.servers.push(server);
        this.writeServeConfig();
    }

    /**
     * 修改 Server 配置项
     */
    modServer(server: IServer): void {
        const findIndex = this.config.servers.findIndex(f => f.serverName === server.serverName);
        this.config.servers.splice(findIndex, 1, server);
        this.writeServeConfig();
    }

    /**
     * 删除 Server 配置项
     */
    delServer(server: IServer): void {
        const findIndex = this.config.servers.findIndex(f => f.serverName === server.serverName);
        this.config.servers.splice(findIndex, 1);
        this.writeServeConfig();
    }

    /**
     * 写入 serve config 配置
     */
    writeServeConfig(): void {
        jsonfile.writeFileSync(ServeConfig.serveConfigPath().path, this.config, { spaces: 4, EOL: '\r\n' });
    }

    /**
     * 读取 serve config 配置
     */
    readServeConfig(): IConfig {
        return jsonfile.readFileSync(ServeConfig.serveConfigPath().path) as IConfig;
    }

    /**
     * 创建 serve config 配置文件
     */
    createServeConfigFile(): void {
        if (fs.existsSync(ServeConfig.serveConfigPath().path)) {
            // ...
        } else {
            fs.mkdirSync(ServeConfig.serveConfigPath().dir);
            fs.writeFileSync(ServeConfig.serveConfigPath().path, '');

            // 初始化配置结构
            this.config = {
                servers: [],
                configPath: ServeConfig.serveConfigPath().path,
            };
            this.writeServeConfig();
        }
    }
}

export default ServeConfig;
